package main

import "fmt"

type cat struct{}

func (c cat) say() {
	fmt.Println("喵喵喵~")
}

type dog struct{}

func (d dog) say() {
	fmt.Println("汪汪汪~")
}

// 接口不管你是什么类型，它只管你要实现什么方法
// 定义一个类型，一个抽象的类型，只要实现say()这个方法的类型都可以成为sayer类型
type sayer interface {
	say()
}

// 定义一个打的函数
func da(arg sayer) {
	arg.say() // 不管是传进来什么，我都要打它，打它，它就会叫，就回执行它的say方法
}
func main() {
	c1 := cat{}
	da(c1) //c1 传到arg变量中
	d1 := dog{}
	da(d1)
}
